package com.luzhikun.dispatcherForward;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


/**
 * 无论是forward()还是Include（）,对于请求来说，都是一样的
 * 他们的不同点主要集中在响应对象
 * <p>
 * forWard()和 Include()的区别
 * <p>
 * forWard():
 * 这个单词的意思表示向前，说明当前的请求还未结束，需要继续向前，所以服务器不会再此处打开标砖输出流
 * 所以此时写到out里边的数据是不会写到浏览器中的
 * 使用forWard()的Servlet，其标准输出流未打开
 * 对客户端的响应肯定不是forWard的Servlet给出的
 * Include():
 * 这个单词表示包含，说明当前请求已经结束，可以对客户端进行响应了，其不仅将自己的数据写入到了标准输出流中
 * 还将其他数据包含到自己的输出流中，
 * 使用include()的Servlet ，其标准输出流已经打开
 * 对客户端的响应是由使用 include()的Servlet 给出的
 * <p>
 * 结论：在使用forWord()请求转发的时候，使用forWord()的Servlet不应该向response中写入数据
 * 若要写入数据，则应使用include()进行请求转发
 */
public class DispatcherForward extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //告诉浏览器当前程序用怎样的格式去解析
        resp.setContentType("text/html");

//        req==org.apache.catalina.connector.RequestFacade@2522c210
        System.out.println("req==" + req);
        //resp==org.apache.catalina.connector.ResponseFacade@3c855c80
        System.out.println("resp==" + resp);

        resp.getWriter().println("this is DispatcherForward before <br>");

        //请求转发
//        req.getRequestDispatcher("other").include(req,resp);
        /*this is DispatcherForward before
        Other Servlet
        this is DispatcherForward after
        */
        //请求转发
        //Other Servlet
        req.getRequestDispatcher("other").forward(req, resp);
        resp.getWriter().println("this is DispatcherForward after <br>");
    }
}
